package com.cskaoyan.javase.oop1._11static._3usecase;

import com.sun.media.jfxmedia.events.NewFrameEvent;
import com.sun.xml.internal.ws.api.message.MessageWritable;

/**
 * static关键字有什么具体的使用场景呢？
 * 这里，我们显然需要根据static关键字的一些特点来明确它的使用场景
 *
 * 静态成员变量：
 * 属于全体对象所共享而不是独属于某个对象的成员变量，所以
 *      当存在需要所有对象共享的变量时，应该使用static
 * 不仅是全体对象共享的，而且是整个类全局独一份的（因为类加载只有一次）
 * 所以，如果希望某个变量在类的全局独一份，它应该是static修饰的变量
 *
 * 静态成员方法：
 * 静态方法的最主要特点就是调用简单，无需创建对象即可调用，所以
 * 如果希望一个方法能够更方便快捷的去调用，可以把它声明为static修饰的静态成员方法
 * 实际上根据静态成员方法调用简单的特点，当一个类中全部都是静态成员方法时
 *
 * 它的方法调用都可以使用类名点去完成，这就是Java当中的“工具类”
 * 比如数组工具类Arrays、集合工具类Collections、数学工具类Math等等
 * 当然，静态成员方法也可以用来给静态成员变量赋值，这类似于用成员方法给成员变量赋值
 *
 * 实际上成员方法也是可以给静态成员变量赋值的，但是这种赋值依赖于创建对象，是比较少用的方式
 *
 * @since 11:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Student s = new Student();
        }
        System.out.println(Student.count);

        // 静态方法最大的优点是不用创建对象,直接就可以调用,很方便
        /*
            所以依据static的这个特点,Java就出现了"工具类"
            工具类:
                指的是类中方法全部都是static修饰的方法
                --> 调用方法全部都用类名点调用,使用起来非常方便
           常见的工具类: Math(数学工具类),Arrays(数组工具类),Objects(对象工具类)
                Collections(集合工具类)
         */
    }
}

class Student {
    static int count = 0;
    // 需求是: 统计在外部new创建Student类对象的次数
    /*
        需要一个变量计数器
        问题: 这个变量应该是什么变量?
            1.局部变量,每个方法一份,不行
            2.成员变量,每个对象一份,不行
            3.静态变量,类全局独一份,可以
     */

    public Student() {
        count++;
    }
}
